package effective_go

import (
	"io"
	"os"
)

// 多返回值
// 命名结果参数
// 延迟 defer
// Go 的 defer 语句用于预设一个函数调用（即推迟执行函数）， 该函数会在执行 defer 的函数返回之前立即执行。
// 被推迟函数的实参（如果该函数为方法则还包括接收者）在推迟执行时就会求值， 而不是在调用执行时才求值。
// 被推迟的函数按照后进先出（LIFO）的顺序执行。

// 内容返回文件的内容作为字符串
func Contents(filename string) (string, error) {
	f, err := os.Open(filename)
	if err != nil {
		return "", err
	}
	defer f.Close() // 我们结束后就关闭了f

	var result []byte
	buf := make([]byte, 100)
	for {
		n, err := f.Read(buf[0:])
		result = append(result, buf[0:n]...)
		if err != nil {
			if err == io.EOF {
				break
			}
			return "", err // 如果我们回到这里，f就关闭了。
		}
	}
	return string(result), nil // 如果我们回到这里，f就关闭了。
}
